package com.diyunapp.xilinapp.utils;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.net.Uri;
import android.util.Log;
import android.widget.Toast;

import com.diyunapp.xilinapp.R;
import com.diyunapp.xilinapp.bean.ParamsBean;
import com.nostra13.universalimageloader.core.DisplayImageOptions;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FormatConfirm {

	private static DisplayImageOptions options;
	
	//将金额固定设置成保留两位小数点的格式，多的会自动截取，少的会自动补位
	public static String moneyTwodot(String srcMoney) {
	  BigDecimal money= new BigDecimal(srcMoney);
	  //设置精度，以及舍入规则
	  money= money.setScale(2, BigDecimal.ROUND_HALF_UP);
	  return money.toString();
	}
	
	//将金额的整数部分设置成每三位加一个逗号的格式
	public static String formatSepratorMoney(String str) {
		 // 将传进数字反转  
		 String reverseStr = new StringBuilder(str).reverse().toString();
		 String strTemp = "";
		 for (int i=0; i<reverseStr.length(); i++) {   
			 if (i*3+3 > reverseStr.length())
			 {   
				 strTemp += reverseStr.substring(i*3,reverseStr.length());   
				 break;   
			 }   
		 strTemp += reverseStr.substring(i*3, i*3+3)+",";   
		}  
		 // 将[789,456,] 中最后一个[,]去除  
		
		 if (strTemp.endsWith(",")) {   
			 strTemp = strTemp.substring(0, strTemp.length()-1);   
		 }  
		 // 将数字重新反转  
		 String resultStr = new StringBuilder(strTemp).reverse().toString();
		 return resultStr;  
	}
	
	//电话号码加密，中间四位设置为*
	public static String phoneEncode(String phone)
	{
		if(phone.isEmpty()||phone.equals("null"))
		{
			phone = "12345678901";
		}
		String temp_phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
		return temp_phone;
	}
	
	//身份证号号码加密，仅保留最后2位
	public static String idnumEncode(String strSrc)
	{
		StringBuffer tempId = new StringBuffer() ;
		for(int i=0; i<strSrc.length()-1;i++)
		{
			if(i<strSrc.length()-3 || i>3)
			{
				tempId.append('*');
			}
			else
			{
				tempId.append(strSrc.charAt(i));
			}
		}
		return tempId.toString();
	}
	
	//银行卡号加密，仅保留头尾的四位
	public static String bankcardEncode(String strSrc)
	{
		StringBuffer tempId = new StringBuffer() ;
		for(int i=0; i<strSrc.length()-1;i++)
		{
			if(i<strSrc.length()-4 || i>3)
			{
				tempId.append(strSrc.charAt(i));
			}
			else
			{
				tempId.append('*');
			}
		}
		return tempId.toString();
	}
		
	//用户真实姓名加密，仅保留最后一个字
	public static String realnameEncode(String strSrc)
	{
		String resultName="";
		char[] array = strSrc.toCharArray();
		for (int i = 0; i < array.length; i++) {
			if(i == array.length-1)
			{
				String temp1  =  resultName+array[i];
				resultName = temp1;
			}
			else
			{
				String temp2  =  resultName+"*";
				resultName = temp2;
			}
		}
		return resultName;
	}
	
	//用户真实姓名加密，仅保留最后一个字
	public static String emailEncode(String strSrc)
	{
		String emailName="";
		String encodeemail = strSrc;
		int index = strSrc.indexOf("@");
		if(index>0)
		{
			String onlyName = strSrc.substring(0,index);
			int encodeNum = 0;    //不加密
			if(onlyName.length() >= 5)
			{
				encodeNum = 3;  //加密最后三位
			}
			else if(onlyName.length() >= 2)
			{
				encodeNum = 1;  //加密最后一位
			}
			
			char[] array = onlyName.toCharArray();
			for (int i = 0; i < array.length; i++) {
				if(i >= array.length - encodeNum)
				{
					String temp2  =  emailName+"*";
					emailName = temp2;
				}
				else
				{
					String temp1  =  emailName + array[i];
					emailName = temp1;
				}
			}
			encodeemail = emailName + strSrc.substring(index);
		}
		
		return encodeemail ;
	}
	//用户名加密，最后两位不加密
	public static String usernameEncodeHead(String strSrc)
	{
		String resultName="";
		char[] array = strSrc.toCharArray();
		for (int i = 0; i < array.length; i++) {
			if(i >= array.length-2)
			{
				String temp1  =  resultName+array[i];
				resultName = temp1;
			}
			else
			{
				String temp2  =  resultName+"*";
				resultName = temp2;
			}
		}
		return resultName;
	}

	//用户名加密，前两位不加密
	public static String usernameEncode(String strSrc)
	{
		String resultName="";
		char[] array = strSrc.toCharArray();
		for (int i = 0; i < array.length; i++) {
			if(i < 2)
			{
				String temp1  =  resultName+array[i];
				resultName = temp1;
			}
			else
			{
				String temp2  =  resultName+"*";
				resultName = temp2;
			}
		}
		return resultName;
	}

	/**  
	 * 验证手机号码  
	 *  
	 * @param phoneNum  
	 * @return  
	 */  
	public static boolean isMobileNum(String phoneNum) {
	    Pattern p = Pattern
	            .compile("^((13[0-9])|(15[0-9])|(17[0-9])|(18[0-9])|(14[0-9]))\\d{8}$");  
	    return p.matcher(phoneNum).matches();  
	}  
	
	/**  
	 * 验证邮箱格式  
	 *  
	 * @param email  
	 * @return  
	 */  
	public static boolean isEmail(String email) {
	    String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
	    Pattern p = Pattern.compile(str);
	    Matcher m = p.matcher(email);
	    return m.matches();  
	}
	
	/*
	 * 验证身份证号 
	 * 
	 * @param IDStr 
	 * @return 
	 * @throws ParseException 
	 */  
	public static boolean isIdCard(String IDStr) {
	    String tipInfo = "该身份证有效！";// 记录错误信息
	    String Ai = "";
	    // 判断号码的长度 15位或18位  
	    if (IDStr.length() != 15 && IDStr.length() != 18) {  
	        tipInfo = "身份证号码长度应该为15位或18位。";  
	        return false;  
	    }  
	  
	  
	    // 18位身份证前17位位数字，如果是15位的身份证则所有号码都为数字  
	    if (IDStr.length() == 18) {  
	        Ai = IDStr.substring(0, 17);  
	    } else if (IDStr.length() == 15) {  
	        Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);  
	    }  
	    if (isNumeric(Ai) == false) {  
	        tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外，都应为数字。";  
	        return false;  
	    }  
	  
	  
	    // 判断出生年月是否有效  
	    String strYear = Ai.substring(6, 10);// 年份
	    String strMonth = Ai.substring(10, 12);// 月份
	    String strDay = Ai.substring(12, 14);// 日期
	    if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {  
	        tipInfo = "身份证出生日期无效。";  
	        return false;  
	    }  
	    GregorianCalendar gc = new GregorianCalendar();
	    SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
	    try {  
	        if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
	                || (gc.getTime().getTime() - s.parse(  
	                strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {  
	            tipInfo = "身份证生日不在有效范围。";  
	            return false;  
	        }  
	    } catch (NumberFormatException e) {
	        e.printStackTrace();  
	    } catch (java.text.ParseException e) {  
	        e.printStackTrace();  
	    }  
	    if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
	        tipInfo = "身份证月份无效";  
	        return false;  
	    }  
	    if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
	        tipInfo = "身份证日期无效";  
	        return false;  
	    }  
	  
	    if (isVarifyCode(Ai, IDStr) == false) {  
	        tipInfo = "身份证校验码无效，不是合法的身份证号码";  
	        return false;  
	    }  
	  
	  
	    return true;  
	}  
	  
	  
	/* 
	 * 判断第18位校验码是否正确 
	* 第18位校验码的计算方式： 
	   　　1. 对前17位数字本体码加权求和 
	   　　公式为：S = Sum(Ai * Wi), i = 0, ... , 16 
	   　　其中Ai表示第i个位置上的身份证号码数字值，Wi表示第i位置上的加权因子，其各位对应的值依次为： 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 
	   　　2. 用11对计算结果取模 
	   　　Y = mod(S, 11) 
	   　　3. 根据模的值得到对应的校验码 
	   　　对应关系为： 
	   　　 Y值：     0  1  2  3  4  5  6  7  8  9  10 
	   　　校验码： 1  0  X  9  8  7  6  5  4  3   2 
	*/  
	private static boolean isVarifyCode(String Ai, String IDStr) {
	    String[] VarifyCode = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
	    String[] Wi = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"};
	    int sum = 0;  
	    for (int i = 0; i < 17; i++) {  
	        sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
	    }  
	    int modValue = sum % 11;  
	    String strVerifyCode = VarifyCode[modValue];
	    Ai = Ai + strVerifyCode;  
	    if (IDStr.length() == 18) {  
	        if (Ai.equals(IDStr) == false) {  
	            return false;  
	  
	        }  
	    }  
	    return true;  
	}  
	
	/** 
    * 判断字符串是否为数字,0-9重复0次或者多次 
    * 
    * @param strnum 
    * @return 
    */  
   private static boolean isNumeric(String strnum) {
       Pattern pattern = Pattern.compile("[0-9]*");
       Matcher isNum = pattern.matcher(strnum);
       if (isNum.matches()) {  
           return true;  
       } else {  
           return false;  
       }  
   }
	   
	
	/** 
    * 功能：判断字符串出生日期是否符合正则表达式：包括年月日，闰年、平年和每月31天、30天和闰月的28天或者29天 
    * 
    * @param strDate 
    * @return 
    */  
   public static boolean isDate(String strDate) {
  
       Pattern pattern = Pattern
               .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$");  
       Matcher m = pattern.matcher(strDate);
       if (m.matches()) {  
           return true;  
       } else {  
           return false;  
       }  
   }

	public static List<ParamsBean> getParameters(String paraStr) {
		Log.i("zhangxiaoxidebug", "paraStr=" + paraStr);
		List<ParamsBean> theParames = new ArrayList<>();

		String tempstr1 = paraStr.replace("{", "");
		String sourceStr = tempstr1.replace("}", "");
		for (int i = 0; ; i++) {
			int dotindex = sourceStr.indexOf(",\""); //为防止内容中含有逗号导致误匹配的问题，将逗号和双引号一起判断
			if (dotindex <= 0) {
				int maohaoIndex = sourceStr.indexOf(":");
				String id = sourceStr.substring(1, maohaoIndex - 1);
				String name = "";
				if(sourceStr.substring(maohaoIndex+1,maohaoIndex+2).equals("\""))
				{
					name = sourceStr.substring(maohaoIndex + 2, sourceStr.length() - 1);
				}
				else
				{
					name = sourceStr.substring(maohaoIndex + 1, sourceStr.length());
				}
				theParames.add(new ParamsBean(id, name));
				Log.i("zhangxiaoxidebug", "inner i=" + i);
				break;
			}
			String desStr = sourceStr.substring(0, dotindex);
			int maohaoIndex = desStr.indexOf("\":");//为防止内容中含有冒号导致误匹配的问题，将双引号和冒号一起判断
			maohaoIndex++;
			String id = desStr.substring(1, maohaoIndex - 1);
			String name = "";
			if(sourceStr.substring(maohaoIndex+1,maohaoIndex+2).equals("\""))
			{
				name = sourceStr.substring(maohaoIndex + 2, desStr.length() - 1);
			}
			else
			{
				name = sourceStr.substring(maohaoIndex + 1, desStr.length());
			}
			theParames.add(new ParamsBean(id, name));
			String tempStr = sourceStr.substring(dotindex + 1, sourceStr.length());
			sourceStr = tempStr;
			Log.i("zhangxiaoxidebug", "out i=" + i);
			Log.i("zhangxiaoxidebug", "sourceStr=" + sourceStr);
		}
		return theParames;
	}

	public static void setOption()
	{
		//显示图片的配置
		options =  new DisplayImageOptions.Builder()
				.showStubImage(R.drawable.list_default) // resource or drawable
				.showImageForEmptyUri(R.drawable.list_default) // resource or drawable
				.showImageOnFail(R.drawable.list_default) // resource or drawable
				.cacheInMemory()
				.cacheOnDisc()
				.build();
	}

	public static DisplayImageOptions getOption()
	{
		return options;
	}


	/**
	 * 生成一个 透明的背景图片
	 *
	 * @return
	 */
	public static Drawable getDrawable(Context myContext) {
		ShapeDrawable bgdrawable = new ShapeDrawable(new OvalShape());
		bgdrawable.getPaint().setColor(myContext.getResources().getColor(android.R.color.transparent));
		return bgdrawable;
	}

	public static void startQQ(Context myContext,String qqNum)
	{
		if(isQQClientAvailable(myContext))
		{
			String url="mqqwpa://im/chat?chat_type=wpa&uin="+qqNum;
			myContext.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
		}
		else
		{
			Toast.makeText(myContext,"您还没有安装QQ客户端，请先完成安装！",Toast.LENGTH_LONG).show();
		}
	}

	/*
         * 判断qq是否可用
         *
         * @param context
         * @return
         */
	public static boolean isQQClientAvailable(Context context) {
		final PackageManager packageManager = context.getPackageManager();
		List<PackageInfo> pinfo = packageManager.getInstalledPackages(0);
		if (pinfo != null) {
			for (int i = 0; i < pinfo.size(); i++) {
				String pn = pinfo.get(i).packageName;
				if (pn.equals("com.tencent.mobileqq")) {
					return true;
				}
			}
		}
		return false;
	}

	public static float stringToFloat(String srcStr)
	{
		float returnf =0;
		if(srcStr==null||srcStr.isEmpty()||srcStr.equals("null")||srcStr.equals("NULL"))
		{

		}
		else
		{
			returnf = Float.parseFloat(srcStr);
		}

		return  returnf;
	}

	public static int stringToInt(String srcStr)
	{
		return  (int)stringToFloat(srcStr);
	}
}
